package com.easy.core.web.controller;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;

import net.sf.json.JSONException;

import org.apache.commons.lang.StringUtils;

import com.easy.core.param.GlobalConst;
import com.easy.core.tools.TypeConvert;


public class SimpleBasicController<T, PK extends Serializable> extends AbstractBasicController{

	@Override
	public String index() {
		return getReturnString("index");
	}

	@Override
	public String list() {
		return null;
	}

	@Override
	public String preAdd() {
		return getReturnString("add");
	}

	@Override
	public String newAdd() {
		try {
			T obj = getBean(ACTION_TYPE.NEWADD);
			if(null!=obj){
				this.commonService.save(obj);
				getOut().print(GlobalConst.returnTrue(""));
			}else getOut().print(GlobalConst.returnFalse("参数错误"));
		} catch (Exception e) {
			log.error(e);
			try {
				getOut().print(GlobalConst.returnFalse(e.getMessage()));
			} catch (JSONException e1) {  }
		} finally {
			closeOut();
		}
		return null;
	}

	@Override
	public String preModify() {
		return getReturnString("modify", true);
	}

	@Override
	public String modify() {
		try {
			T obj = getBean(ACTION_TYPE.MODIFY);
			if(null!=obj){
				this.commonService.update(obj);
				getOut().print(GlobalConst.returnTrue(""));
			}else getOut().print(GlobalConst.returnFalse("参数错误"));
		} catch (Exception e) {
			log.error(e);
			try {
				getOut().print(GlobalConst.returnFalse(e.getMessage()));
			} catch (JSONException e1) {  }
		} finally {
			closeOut();
		}
		return null;
	}

	@Override
	public String view() {
		return getReturnString("view", true);
	}

	@Override
	public String delete() {
		try {
			String ids = request.getParameter("id");
			if(StringUtils.isNotBlank(ids)){
				for(String id_str : ids.trim().split("[,，]")){
					this.commonService.delete(findById(id_str));
				}
				getOut().print(GlobalConst.returnTrue(""));
			}else getOut().print(GlobalConst.returnFalse("参数错误！"));
		} catch (Exception e) {
			log.error(e);
			try {
				getOut().print(GlobalConst.returnFalse(e.getMessage()));
			} catch (JSONException e1) {  }
		} finally {
			closeOut();
		}
		return null;
	}
	
	/**
	 * 描述：页面跳转
	 * @param pageName		jsp页面的名称
	 * @return String
	 */
	private String getReturnString(String pageName){
		return getReturnString(pageName, false);
	}
	
	/**
	 * 描述：页面跳转
	 * @param pageName		jsp页面的名称
	 * @param needFindBean	是否需要根据主键id查询对应的bean对象
	 * @return String
	 */
	private String getReturnString(String pageName, boolean needFindBean){
		String root = getRootPath();
		if(StringUtils.isNotBlank(root)) {
			if(needFindBean){
				String id = request.getParameter("id");
				if(StringUtils.isNotBlank(id)) request.setAttribute("obj", findById(id));
			}
			return root+"/"+pageName;
		}
		return null;
	}
	
	/**
	 * 描述：根据主键值获取对象
	 * @param id		主键
	 * @return Object	对象
	 */
	private Object findById(String id){
		Serializable pk = (Serializable) TypeConvert.convertValue(id, getClazz(1));
		return commonService.findById(getClazz(0), pk);
	}
	
	/**
	 * 描述：根据泛型定义的序号获取子类的泛型Class
	 * @param Serializable
	 * @return Class<?>
	 */
	private Class<?> getClazz(int Serializable){
		return (Class<?>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[Serializable];
	}
	
	protected enum ACTION_TYPE{
		/**
		 * 首页跳转
		 */
		INDEX,
		/**
		 * 查询列表
		 */
		LIST,
		/**
		 * 新增
		 */
		NEWADD,
		/**
		 * 修改
		 */
		MODIFY,
		/**
		 * 浏览
		 */
		VIEW,
		/**
		 * 删除
		 */
		DELETE
	}
	
	/*************************集成之后需要实现的************************************/
	/**
	 * 描述：获取当前功能页面文件的根路径（相对路径）
	 * 		用于自动生成对应的跳转路径，jsp页面文件名称必须是标准名称，如：add.jsp
	 * 		该方法重写才能实现自动跳页
	 * @return String
	 */
	protected String getRootPath() {
		return null;
	}
	
	/**
	 * 描述：获取当前处理对象bean
	 * @return T
	 */
	public T getBean(ACTION_TYPE type) {
		return null;
	}
}












